Kuasai pembentukan ulang data dengan tabel pivot Python Pandas. Pembahasan mendalam tentang sintaks, teknik canggih, dan contoh praktis untuk analisis data global.
Tabel Pivot Python Pandas: Panduan Komprehensif untuk Pembentukan Ulang Data
Dalam dunia analisis data, kemampuan untuk meringkas, mengagregasi, dan merestrukturisasi data bukanlah sekadar keahlian—itu adalah kekuatan super. Data mentah, dalam bentuk aslinya, sering kali menyerupai buku besar yang luas dan terperinci. Kaya akan informasi tetapi sulit diinterpretasikan. Untuk mendapatkan wawasan yang bermakna, kita perlu mengubah buku besar ini menjadi ringkasan yang ringkas. Di sinilah tabel pivot unggul, dan bagi programmer Python, pustaka Pandas menyediakan alat yang kuat dan fleksibel: pivot_table().
Panduan ini dirancang untuk audiens global yang terdiri dari analis data, ilmuwan, dan penggemar Python. Kita akan menyelami mekanisme tabel pivot Pandas, mulai dari konsep fundamental hingga teknik tingkat lanjut. Baik Anda meringkas angka penjualan dari benua yang berbeda, menganalisis data iklim di berbagai wilayah, atau melacak metrik proyek untuk tim yang terdistribusi, menguasai tabel pivot secara fundamental akan mengubah cara Anda mendekati eksplorasi data.
Apa Sebenarnya Tabel Pivot itu?
Jika Anda pernah menggunakan perangkat lunak spreadsheet seperti Microsoft Excel atau Google Sheets, Anda mungkin sudah familiar dengan konsep tabel pivot. Ini adalah tabel interaktif yang memungkinkan Anda mengatur ulang dan meringkas kolom dan baris data terpilih dari kumpulan data yang lebih besar untuk mendapatkan laporan yang diinginkan.
Tabel pivot melakukan dua hal utama:
- Agregasi: Ini menghitung statistik ringkasan (seperti jumlah, rata-rata, atau hitungan) untuk data numerik yang dikelompokkan berdasarkan satu atau lebih kategori.
- Pembentukan Ulang (Reshaping): Ini mengubah data dari format 'panjang' ke format 'lebar'. Alih-alih memiliki semua nilai dalam satu kolom, ia 'memutar' nilai unik dari suatu kolom menjadi kolom baru dalam output.
Fungsi Pandas pivot_table() membawa fungsionalitas canggih ini langsung ke alur kerja analisis data Python Anda, memungkinkan pembentukan ulang data yang dapat direproduksi, diskriptif, dan terukur.
Menyiapkan Lingkungan dan Data Sampel Anda
Sebelum kita mulai, pastikan Anda telah menginstal pustaka Pandas. Jika belum, Anda dapat menginstalnya menggunakan pip, penginstal paket Python:
pip install pandas
Sekarang, mari kita impor di skrip atau notebook Python kita:
import pandas as pd
import numpy as np
Membuat Kumpulan Data Penjualan Global
Untuk membuat contoh kita praktis dan relevan secara global, kita akan membuat kumpulan data sintetis yang mewakili data penjualan untuk perusahaan e-commerce multinasional. Kumpulan data ini akan mencakup informasi penjualan dari berbagai wilayah, negara, dan kategori produk.
# Create a dictionary of data
data = {
'TransactionID': range(1, 21),
'Date': pd.to_datetime([
'2023-01-15', '2023-01-16', '2023-01-17', '2023-02-10', '2023-02-11',
'2023-02-12', '2023-03-05', '2023-03-06', '2023-03-07', '2023-01-20',
'2023-01-21', '2023-02-15', '2023-02-16', '2023-03-10', '2023-03-11',
'2023-01-18', '2023-02-20', '2023-03-22', '2023-01-25', '2023-02-28'
]),
'Region': [
'North America', 'Europe', 'Asia', 'North America', 'Europe', 'Asia', 'North America', 'Europe', 'Asia', 'Europe',
'Asia', 'North America', 'Europe', 'Asia', 'North America', 'Asia', 'Europe', 'North America', 'Europe', 'Asia'
],
'Country': [
'USA', 'Germany', 'Japan', 'Canada', 'France', 'India', 'USA', 'UK', 'China', 'Germany',
'Japan', 'USA', 'France', 'India', 'Canada', 'China', 'UK', 'USA', 'Germany', 'India'
],
'Product_Category': [
'Electronics', 'Apparel', 'Electronics', 'Books', 'Apparel', 'Electronics', 'Books', 'Electronics', 'Apparel',
'Apparel', 'Books', 'Electronics', 'Books', 'Apparel', 'Electronics', 'Books', 'Apparel', 'Books', 'Electronics', 'Electronics'
],
'Units_Sold': [10, 5, 8, 20, 7, 12, 15, 9, 25, 6, 30, 11, 18, 22, 14, 28, 4, 16, 13, 10],
'Unit_Price': [1200, 50, 900, 15, 60, 1100, 18, 950, 45, 55, 12, 1300, 20, 40, 1250, 14, 65, 16, 1150, 1050]
}
# Create DataFrame
df = pd.DataFrame(data)
# Calculate Revenue
df['Revenue'] = df['Units_Sold'] * df['Unit_Price']
# Display the first few rows of the DataFrame
print(df.head())
Kumpulan data ini memberi kita dasar yang kuat dengan campuran data kategorikal (Wilayah, Negara, Kategori_Produk), data numerik (Unit_Terjual, Pendapatan), dan data deret waktu (Tanggal).
Anatomi pivot_table()
Fungsi Pandas pivot_table() sangat serbaguna. Mari kita uraikan parameter-parameternya yang paling penting:
pandas.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, margins_name='All')
- data: DataFrame yang ingin Anda pivot.
- values: Kolom yang berisi data yang akan diagregasi. Jika tidak ditentukan, semua kolom numerik yang tersisa akan digunakan.
- index: Kolom yang nilai uniknya akan membentuk baris tabel pivot baru. Ini terkadang disebut 'kunci pengelompokan'.
- columns: Kolom yang nilai uniknya akan 'diputar' untuk membentuk kolom tabel baru.
- aggfunc: Fungsi agregasi yang akan diterapkan pada 'values'. Ini bisa berupa string seperti 'sum', 'mean', 'count', 'min', 'max', atau fungsi seperti
np.sum. Anda juga dapat meneruskan daftar fungsi atau kamus untuk menerapkan fungsi yang berbeda ke kolom yang berbeda. Defaultnya adalah 'mean'. - fill_value: Sebuah nilai untuk mengganti hasil yang hilang (NaN) dalam tabel pivot.
- margins: Sebuah boolean. Jika diatur ke
True, ini akan menambahkan subtotal untuk baris dan kolom (juga dikenal sebagai grand total). - margins_name: Nama untuk baris/kolom yang berisi total ketika
margins=True. Defaultnya adalah 'All'.
Tabel Pivot Pertama Anda: Contoh Sederhana
Mari kita mulai dengan pertanyaan bisnis umum: "Berapa total pendapatan yang dihasilkan oleh setiap kategori produk?"
Untuk menjawab ini, kita perlu:
- Gunakan
Product_Categoryuntuk baris (index). - Agregasi kolom
Revenue(values). - Gunakan jumlah sebagai fungsi agregasi kita (aggfunc).
# Simple pivot table to see total revenue by product category
category_revenue = pd.pivot_table(df,
values='Revenue',
index='Product_Category',
aggfunc='sum')
print(category_revenue)
Output:
Revenue
Product_Category
Apparel 1645
Books 1184
Electronics 56850
Seketika, kita memiliki ringkasan yang jelas dan ringkas. Log transaksi mentah yang terdiri dari 20 baris telah dibentuk ulang menjadi tabel 3 baris yang secara langsung menjawab pertanyaan kita. Inilah kekuatan fundamental dari tabel pivot.
Menambahkan Dimensi Kolom
Sekarang, mari kita kembangkan ini. Bagaimana jika kita ingin melihat total pendapatan berdasarkan kategori produk, tetapi juga dipecah berdasarkan wilayah? Di sinilah parameter columns berperan.
# Pivot table with index and columns
revenue_by_category_region = pd.pivot_table(df,
values='Revenue',
index='Product_Category',
columns='Region',
aggfunc='sum')
print(revenue_by_category_region)
Output:
Region Asia Europe North America Product_Category Apparel 1125.0 625.0 NaN Books 336.0 360.0 488.0 Electronics 13200.0 14550.0 29100.0
Output ini jauh lebih kaya. Kita telah memutar nilai-nilai unik dari kolom 'Region' ('Asia', 'Europe', 'North America') menjadi kolom baru. Kita sekarang dapat dengan mudah membandingkan bagaimana kinerja kategori produk yang berbeda di seluruh wilayah. Kita juga melihat nilai NaN (Not a Number). Ini menunjukkan bahwa tidak ada penjualan 'Apparel' yang tercatat untuk 'Amerika Utara' dalam kumpulan data kita. Ini adalah informasi yang berharga itu sendiri!
Teknik Pivoting Tingkat Lanjut
Dasar-dasarnya kuat, tetapi fleksibilitas sejati pivot_table() terungkap dalam fitur-fitur canggihnya.
Menangani Nilai Hilang dengan fill_value
Nilai NaN di tabel kita sebelumnya akurat, tetapi untuk pelaporan atau perhitungan lebih lanjut, mungkin lebih baik menampilkannya sebagai nol. Parameter fill_value membuatnya mudah.
# Using fill_value to replace NaN with 0
revenue_by_category_region_filled = pd.pivot_table(df,
values='Revenue',
index='Product_Category',
columns='Region',
aggfunc='sum',
fill_value=0)
print(revenue_by_category_region_filled)
Output:
Region Asia Europe North America Product_Category Apparel 1125 625 0 Books 336 360 488 Electronics 13200 14550 29100
Tabel sekarang lebih bersih dan mudah dibaca, terutama untuk audiens non-teknis.
Bekerja dengan Beberapa Indeks (Pengindeksan Hierarkis)
Bagaimana jika Anda perlu mengelompokkan berdasarkan lebih dari satu kategori pada baris? Misalnya, mari kita pecah penjualan berdasarkan Region dan kemudian berdasarkan Country di dalam setiap wilayah. Kita dapat meneruskan daftar kolom ke parameter index.
# Multi-level pivot table using a list for the index
multi_index_pivot = pd.pivot_table(df,
values='Revenue',
index=['Region', 'Country'],
aggfunc='sum',
fill_value=0)
print(multi_index_pivot)
Output:
Revenue
Region Country
Asia China 488
India 1760
Japan 10860
Europe France 1020
Germany 14440
UK 1115
North America Canada 17800
USA 12058
Pandas secara otomatis membuat MultiIndex pada baris. Struktur hierarkis ini fantastis untuk menelusuri data Anda dan melihat hubungan yang bertingkat. Anda dapat menerapkan logika yang sama ke parameter columns untuk membuat kolom hierarkis.
Menggunakan Beberapa Fungsi Agregasi
Terkadang, satu statistik ringkasan tidak cukup. Anda mungkin ingin melihat total pendapatan (jumlah) dan ukuran transaksi rata-rata (rata-rata) untuk setiap kelompok. Anda dapat meneruskan daftar fungsi ke aggfunc.
# Using multiple aggregation functions
multi_agg_pivot = pd.pivot_table(df,
values='Revenue',
index='Region',
aggfunc=['sum', 'mean', 'count'])
print(multi_agg_pivot)
Output:
sum mean count
Revenue Revenue Revenue
Region
Asia 13108.000000 2184.666667 6
Europe 16575.000000 2762.500000 6
North America 29858.000000 4976.333333 6
Perintah tunggal ini memberi kita ringkasan komprehensif: total pendapatan, pendapatan rata-rata per transaksi, dan jumlah transaksi untuk setiap wilayah. Perhatikan bagaimana Pandas membuat kolom hierarkis untuk menjaga output tetap terorganisir.
Menerapkan Fungsi Berbeda untuk Nilai Berbeda
Anda bisa mendapatkan lebih rinci lagi. Bayangkan Anda ingin melihat jumlah Revenue tetapi rata-rata Units_Sold. Anda dapat meneruskan kamus ke aggfunc di mana kunci adalah nama kolom ('values') dan nilai adalah fungsi agregasi yang diinginkan.
# Different aggregations for different values
dict_agg_pivot = pd.pivot_table(df,
index='Region',
values=['Revenue', 'Units_Sold'],
aggfunc={
'Revenue': 'sum',
'Units_Sold': 'mean'
},
fill_value=0)
print(dict_agg_pivot)
Output:
Revenue Units_Sold
Region
Asia 13108 17.833333
Europe 16575 8.166667
North America 29858 14.333333
Tingkat kontrol ini yang menjadikan pivot_table() alat utama untuk analisis data yang canggih.
Menghitung Grand Total dengan margins
Untuk tujuan pelaporan, memiliki total baris dan kolom seringkali penting. Argumen margins=True menyediakan ini tanpa usaha ekstra.
# Adding totals with margins=True
revenue_with_margins = pd.pivot_table(df,
values='Revenue',
index='Product_Category',
columns='Region',
aggfunc='sum',
fill_value=0,
margins=True,
margins_name='Grand Total') # Custom name for totals
print(revenue_with_margins)
Output:
Region Asia Europe North America Grand Total Product_Category Apparel 1125 625 0 1750 Books 336 360 488 1184 Electronics 13200 14550 29100 56850 Grand Total 14661 15535 29588 59784
Pandas secara otomatis menghitung jumlah untuk setiap baris (total pendapatan per kategori produk di seluruh wilayah) dan setiap kolom (total pendapatan per wilayah di seluruh kategori), ditambah grand total untuk semua data di sudut kanan bawah.
Kasus Penggunaan Praktis: Analisis Berbasis Waktu
Tabel pivot tidak terbatas pada kategori statis. Mereka sangat berguna untuk menganalisis data deret waktu. Mari kita temukan total pendapatan untuk setiap bulan.
Pertama, kita perlu mengekstrak bulan dari kolom 'Date' kita. Kita bisa menggunakan aksesor .dt di Pandas untuk ini.
# Extract month from the Date column
df['Month'] = df['Date'].dt.month_name()
# Pivot to see monthly revenue by product category
monthly_revenue = pd.pivot_table(df,
values='Revenue',
index='Month',
columns='Product_Category',
aggfunc='sum',
fill_value=0)
# Optional: Order the months correctly
month_order = ['January', 'February', 'March']
monthly_revenue = monthly_revenue.reindex(month_order)
print(monthly_revenue)
Output:
Product_Category Apparel Books Electronics Month January 250 360 23100 February 795 794 24250 March 705 30 9500
Tabel ini memberi kita gambaran yang jelas tentang kinerja penjualan setiap kategori dari waktu ke waktu, memungkinkan kita untuk dengan mudah melihat tren, musiman, atau anomali.
pivot_table() vs. groupby(): Apa Bedanya?
Ini adalah pertanyaan umum bagi mereka yang belajar Pandas. Kedua fungsi ini sangat terkait, dan pada kenyataannya, pivot_table() dibangun di atas groupby().
groupby()adalah operasi yang lebih umum dan fundamental. Ini mengelompokkan data berdasarkan kriteria tertentu dan kemudian memungkinkan Anda menerapkan fungsi agregasi. Hasilnya biasanya berupa Pandas Series atau DataFrame dengan indeks hierarkis, tetapi tetap dalam format 'panjang'.pivot_table()adalah alat khusus yang melakukan group-by dan kemudian membentuk ulang data. Tujuan utamanya adalah mengubah data dari format panjang ke format lebar, yang seringkali lebih mudah dibaca manusia.
Mari kita tinjau kembali contoh pertama kita menggunakan groupby():
# Same result as our first pivot table, but using groupby
category_revenue_groupby = df.groupby('Product_Category')['Revenue'].sum()
print(category_revenue_groupby)
Hasilnya adalah Pandas Series yang secara fungsional setara dengan DataFrame dari tabel pivot pertama kita. Namun, ketika Anda memperkenalkan kunci pengelompokan kedua (seperti 'Region'), perbedaannya menjadi jelas.
# Grouping by two columns
groupby_multi = df.groupby(['Product_Category', 'Region'])['Revenue'].sum()
print(groupby_multi)
Output (a Series with a MultiIndex):
Product_Category Region
Apparel Asia 1125
Europe 625
Books Asia 336
Europe 360
North America 488
Electronics Asia 13200
Europe 14550
North America 29100
Name: Revenue, dtype: int64
Untuk mendapatkan format 'lebar' yang sama dengan pivot_table(index='Product_Category', columns='Region'), Anda perlu menggunakan groupby() diikuti dengan unstack():
# Replicating a pivot table with groupby().unstack()
groupby_unstack = df.groupby(['Product_Category', 'Region'])['Revenue'].sum().unstack(fill_value=0)
print(groupby_unstack)
Ini menghasilkan output yang persis sama dengan tabel pivot kita dengan kolom. Jadi, Anda bisa menganggap pivot_table() sebagai jalan pintas yang nyaman untuk alur kerja groupby().aggregate().unstack() yang umum.
Kapan menggunakan yang mana?
- Gunakan
pivot_table()ketika Anda menginginkan output format lebar yang mudah dibaca manusia, terutama untuk pelaporan atau membuat crosstab. - Gunakan
groupby()ketika Anda membutuhkan lebih banyak fleksibilitas, melakukan perhitungan menengah dalam pipeline pemrosesan data, atau ketika format lebar yang dibentuk ulang bukan tujuan akhir Anda.
Kinerja dan Praktik Terbaik
Meskipun pivot_table() kuat, penting untuk menggunakannya secara efisien, terutama dengan kumpulan data besar.
- Filter Terlebih Dahulu, Pivot Kemudian: Jika Anda hanya perlu menganalisis sebagian kecil dari data Anda (misalnya, penjualan dari tahun lalu), saring DataFrame sebelum menerapkan tabel pivot. Ini mengurangi jumlah data yang harus diproses oleh fungsi.
- Gunakan Tipe Kategorikal: Untuk kolom yang sering Anda gunakan sebagai indeks atau kolom dalam tabel pivot Anda (seperti 'Region' atau 'Product_Category'), ubah mereka ke tipe data 'category' di Pandas. Ini dapat secara signifikan mengurangi penggunaan memori dan mempercepat operasi pengelompokan.
df['Region'] = df['Region'].astype('category') - Jaga Agar Tetap Terbaca: Hindari membuat tabel pivot dengan terlalu banyak indeks dan kolom. Meskipun mungkin, tabel pivot yang lebarnya ratusan kolom dan panjangnya ribuan baris bisa menjadi sama tidak terbaca seperti data mentah asli. Gunakan untuk membuat ringkasan yang ditargetkan.
- Pahami Agregasi: Perhatikan pilihan
aggfuncAnda. Menggunakan 'sum' pada harga tidak masuk akal, sementara 'mean' mungkin lebih tepat. Selalu pastikan agregasi Anda selaras dengan pertanyaan yang ingin Anda jawab.
Kesimpulan: Alat Anda untuk Ringkasan yang Penuh Wawasan
Fungsi Pandas pivot_table() adalah alat yang sangat diperlukan dalam toolkit setiap analis data. Ini menyediakan cara deklaratif, ekspresif, dan kuat untuk beralih dari data yang berantakan dan terperinci ke ringkasan yang bersih dan penuh wawasan. Dengan memahami dan menguasai komponen intinya—values, index, columns, dan aggfunc—dan memanfaatkan fitur-fitur canggihnya seperti pengindeksan multi-level, agregasi kustom, dan margin, Anda dapat membentuk ulang data Anda untuk menjawab pertanyaan bisnis yang kompleks hanya dengan beberapa baris kode Python.
Lain kali Anda dihadapkan pada kumpulan data yang besar, tahan godaan untuk menggulir baris yang tak ada habisnya. Sebaliknya, pikirkan pertanyaan yang perlu Anda jawab dan bagaimana tabel pivot dapat membentuk ulang data Anda untuk mengungkap cerita yang tersembunyi di dalamnya. Selamat melakukan pivoting!